Список изменений Standard Peripherals Library для МК К1986ВК025 (MDR32F02), MDR1206FI, MDR1206AFI.

Изменения, на которые стоит обратить отдельное внимание (например, нарушающие обратную совместимость) указаны как [КРИТИЧЕСКОЕ].

--------------------------------------------------------------------------------

v.0.2.0 01/07/2025

Добавлено:
    CMSIS-CORE:
        1. COMPILER: добавлены определения __NOP и __WFI.
        2. EXTENSION_M: добавлены функции для обращения к инструкциям расширения M (целочисленное умножение и деление).
        3. EXTENSION_ZICNTR: добавлено описание CSR регистров расширения Zicntr.
        4. EXTENSION_ZIFENCEI: добавлена функция rv_fence_i() для синхронизации потока подкачки команд и потока чтения/записи данных (команда FENCE.I).
        5. PMP: для микроконтроллеров MDR1206(A)FI добавлен драйвер PMP (Physical Memory Protection).
    CMSIS-DEVICE:
        1. LINK:
            - добавлены секции .ram_data, .ram_bss и .ram_ahb_text в соответствии с одноименными макросами из system_MDR32VF0xI_sections.h;
            - для GCC добавлены секции .data_aux и .bss_aux, которые с включенной опцией компоновщика "--enable-non-contiguous-regions" позволяют размещать данные (data/bss) в обоих областях ОЗУ TCM;
            - для GCC добавлена возможность установки значений символов __stack_size, __heap_size и __boot_ram_size вне скрипта компоновщика;
            - для IAR области ОЗУ TCMA и TCMB объединены, что позволяет компоновщику размещать данные (data/bss) в обоих областях ОЗУ TCM;
            - для GCC добавлены секции .user_text и .user_data для размещения пользовательских кода и данных по определенным адресам - задание адресов выполняется на уровне используемого под требуемую память скрипта .ld;
            - добавлены секции .preinit_array, .init_array и .fini_array для работы с конструкторами и деструкторами С++.
        2. MDR32VF0xI: добавлены определения аппаратных параметров микроконтроллеров: тактовые частоты, напряжение VREF_INT 2.4V, CHIP_ID, типовые значения TRIM_HSI, TRIM_BG для микроконтроллеров MDR1206(A)FI и аппаратные/типовые времена запусков HSI, LSI, HSE, LSE и PLL.
        3. STARTUP:
            - для IAR добавлены startup-файлы, разработанные на основе стандартного cstartup.s в составе среды;
            - для GCC добавлена инициализация секций .data_aux, .bss_aux, .ram_bss и .ram_ahb_text;
            - для GCC после возврата из функции main() выполняется переход к функции __libc_fini_array для вызова деструкторов.
        4. SYSTEM: добавлены опциональные установка триммингов и обход не-запуска BLDO.
        5. SYSTEM_IT: для микроконтроллеров MDR1206(A)FI добавлена возможность в M-режиме определить векторные и невекторные прерывания вытесняемыми (реализует вложенные прерывания).
        6. SYSTEM_SECTIONS:
            - добавлен макрос __RAM_TEXT_NOINLINE для размещения функций в ОЗУ TCM без оптимизации встраивания;
            - добавлены макросы __RAM_DATA и __RAM_BSS для размещения данных отдельно от функций с макросом __RAM_TEXT_NOINLINE (данные и функции размещаются в разных областях ОЗУ TCM);
            - добавлены макросы __RAM_AHB_TEXT и __RAM_AHB_TEXT_NOINLINE для размещения функций в ОЗУ AHB.
    SPL:
        1. ADC: добавлены структура ADC_Result_TypeDef и функция ADC_GetResultStruct(), а также макрос ADC_RESULT_TO_TEMPERATURE для преобразования результата АЦП с термодатчика в температуру на основе формулы из спецификации.
        2. ADCUI: для микроконтроллеров MDR1206(A)FI через assert_param(IS_ADCUI_CLK_OSR_VALID) добавлена проверка на использование только рекомендуемых документацией настроек полей OSR_CONF и CLC_ADC_CFG.
        3. BKP: добавлена функция BKP_RTC_WaitClkSwitch() для ожидания переключения мультиплексора RTC_CLK.
        4. CONFIG: добавлен функционал, который позволяет точно рассчитывать время запуска кварцевых резонаторов HSE и LSE (зависимость от параметров резонаторов).
        5. I2C: добавлен сброс регистра TXD в функции I2C_DeInit().
        6. FLASH:
            - добавлены функции FLASH_ReadWordBurst()/FLASH_ProgramWordBurst() для чтения/программирования непрерывного массива в пакетном режиме;
            - для микроконтроллеров MDR1206(A)FI добавлена функция FLASH_JTAG_GetLockStatus() для получения статуса блокировки JTAG, выполненной с помощью программирования ячеек памяти OTP;
            - для микроконтроллеров MDR1206(A)FI добавлена функция FLASH_GetChipID() для непосредственного чтения ID микроконтроллера из регистра CHIP_ID_CTRL.
        7. PORT: добавлен параметр PORT_DIRECTION_INOUT при настройке направления работы порта: в данном случае вывод работает и на вход (регистрируется то, что происходит на выходе), и на выход.
        8. RST_CLK:
            - добавлены структура RST_CLK_HCLK_InitTypeDef и функции RST_CLK_HCLK_Init(), RST_CLK_HCLK_StructInit() для настройки частоты HCLK;
            - добавлены функции RST_CLK_PER1_C2_GetCmdState() и RST_CLK_WWDG_C2_GetCmdState().
            - добавлена энумерация RST_CLK_Frequencies_TypeDef.
        9. UTILS:
            - добавлена функция FactoryDataTrimInit();
            - добавлена функция WWDG_SystemReset() для программного сброса микроконтроллера с помощью WWDG;
            - добавлена задержка с использованием счетчика ядра CYCLE.

Изменено:
    CMSIS-CORE:
        1. CLIC:
            - при установке уровня или приоритета прерывания добавлена защита записываемого значения: если значение больше, чем доступно, то устанавливается максимально доступное значение;
            - в функции CLIC_SetVectorTable() и CLIC_SetTrapVector() после изменения CSR_xTVT и CSR_xTVEC добавлена синхронизация потока подкачки команд и потока чтения/записи данных (команда FENCE.I).
        2. COMPILER: исправлено определение __FORCEINLINE.
        3. CLINT:
            - вместо определения CLINT_MTIME_OFFSET используется CLINT_MTIMER_MTIME_OFFSET.
            - исправлены описания аргументов функций.
        4. CSR: [КРИТИЧЕСКОЕ] изменены названия макросов для соответствия соглашению об именах в остальных драйверах.
        5. EXTENSION_XGOST:
            - исправлена функция gost64kuld() при (__riscv_xlen == 32).
            - макросы заменены на функции.
        6. PLIC:
            - в функцию PLIC_SetTrapVector() после изменения CSR_xTVEC добавлена синхронизация потока подкачки команд и потока чтения/записи данных (команда FENCE.I).
    CMSIS-DEVICE:
        1. CORE_CONFIG:
            - [КРИТИЧЕСКОЕ] изменено название определения CLINT_MTIME_OFFSET на CLINT_MTIMER_MTIME_OFFSET;
            - [КРИТИЧЕСКОЕ] изменены возможные значения определений CLINT_PRESENT, PLIC_PRESENT, CLIC_PRESENT, CORE_EXTENSION_XGOST: с "0"/"1" на "определение не объявлено"/"определение объявлено".
        2. LINK:
            - исправлено размещение данных в секцию .ram_ahb_bss;
            - секции HEAP и STACK перенесены в начало области ОЗУ TCM;
            - [КРИТИЧЕСКОЕ] для GCC названия секций .ahbram_data, .ahbram_bss и .ramfunc заменены на .ram_ahb_data*, .ram_ahb_bss* и .ram_text* соответственно;
            - [КРИТИЧЕСКОЕ] для GCC названия секций .text.init и .text.header заменены на .init и .init.header соответственно;
            - для GCC входные секции .ram_ahb_data и .ram_ahb_bss заменены на .ram_ahb_data* и .ram_ahb_bss* соответственно для поддержки уникальных имен секций;
            - [КРИТИЧЕСКОЕ] для GCC размер секции HEAP устанавливается в фиксированное значение __heap_size;
            - [КРИТИЧЕСКОЕ] для GCC скорректировано определение символов секций, REGION_RAMFUNC заменено на REGION_TEXT_DATA;
            - для GCC для символа __global_pointer$ добавлено ограничение для размещения в REGION_DATA;
            - [КРИТИЧЕСКОЕ] для GCC общая часть скриптов компоновщика с описанием секций вынесена в отдельный файл link_<MCU>_common.ld;
            - для GCC в link_RAM_TCM_debug.ld и link_RAM_TCM_release.ld код и данные размещены по разным областям ОЗУ TCM;
            - [КРИТИЧЕСКОЕ] для IAR названия секций ahbram_data, ahbram_bss и ramfunc заменены на .ram_ahb_data, .ram_ahb_bss и .ram_text соответственно;
            - для IAR секция .ram_text перенесена в область ОЗУ TCM;
            - секция .rodata для устранения конфликтов между LMA и VMA размещается аналогично секции .text: >REGION_TEXT AT >REGION_LOAD.
        3. MDR32VF0xI:
            - [КРИТИЧЕСКОЕ] исправлено название определения RST_CLK_PER2_CLOCK_PCLK_EN_IWDT на RST_CLK_PER2_CLOCK_PCLK_EN_IWDG для соответствия документации.
            - исправлено значение определения RST_CLK_PLL_CONTROL_PLL_CPU_MUL_Msk.
            - скорректирована длина маски определения FLASH_CMD_DELAY_Msk на значение 0x7 для соответствия документации.
            - [КРИТИЧЕСКОЕ] изменены названия определений BOOT_OTP* и BOOT_FLASH* на OTP_BOOT* и FLASH_BOOT* соответственно;
            - [КРИТИЧЕСКОЕ] изменены названия определений *ID217 и *ID215 на *MDR1206FI* и *MDR1206AFI* соответственно, используемые при USE_MDR1206.
        4. STARTUP: для GCC инициализация секций .*text*, .*data*, .*bss* реализована с использованием таблицы.
        5. SYSTEM: в определениях *_FREQUENCY_Hz стандартные типы библиотеки stdint.h заменены на модификаторы констант.
        6. SYSTEM_IT:
            - в определениях *_FREQUENCY_Hz стандартные типы библиотеки stdint.h заменены на модификаторы констант;
            - обработчик невекторных прерываний и исключений Trap_IRQHandler() перенесен в область ОЗУ TCM для обеспечения наилучшего быстродействия при обработке прерываний.
        7. SYSTEM_CONFIG:
            - в определениях *_FREQUENCY_Hz стандартные типы библиотеки stdint.h заменены на модификаторы констант;
            - [КРИТИЧЕСКОЕ] изменены возможные значения определений PLIC_SYSTEM_INIT, CLIC_SYSTEM_INIT, CLIC_SYSTEM_INIT_VECTOR_MODE_IRQ: с "0"/"1" на "определение не объявлено"/"определение объявлено".
        8. SYSTEM_SECTIONS:
            - [КРИТИЧЕСКОЕ] названия макросов __RAMFUNC, __ahbram_data и __ahbram_bss приведены в соответствие с названиями секций: __RAM_TEXT, __RAM_AHB_DATA и __RAM_AHB_BSS, переименование макросов выполнено для всех драйверов SPL;
            - для GCC макросы размещения в секции скорректированы для формирования уникальных имен секций, что позволяет компоновщику удалять неиспользуемые функции/данные.
    SPL:
        1. ADCUI: исправлен сброс флагов для канала F2 в функции ADCUI_ClearFlags().
        2. BKP:
            - для уменьшения размера изменен порядок элементов структуры BKP_RTC_AlarmDateTime_TypeDef;
            - исправлена работа функции BKP_LSE_Cmd();
            - [КРИТИЧЕСКОЕ] программная задержка изменена на задержку с использованием счетчика ядра CYCLE;
            - для обеспечения точности скорректированы функции: BKP_HSI_GetStatus(), BKP_LSI_GetStatus() и BKP_LSE_GetStatus();
            - [КРИТИЧЕСКОЕ] изменена функция BKP_DeInit(): реализована деинициализация выбранных подблоков батарейного домена, оптимизирован сброс BKP MEM, добавлено маскирование сброса LDO_BOOST для микроконтроллеров MDR1206(A)FI.
        3. CONFIG:
            - макросы размещения в секции __RAMFUNC, __ahbram_data и __ahbram_bss перенесены на уровень CMSIS-DEVICE в файл system_MDR32VF0xI_sections.h;
            - [КРИТИЧЕСКОЕ] изменены возможные значения определений HSE_EXT_GEN_MODE, LSE_EXT_GEN_MODE, DMA_ALTERNATE_DATA, PLIC_SYSTEM_INIT, CLIC_SYSTEM_INIT, CLIC_SYSTEM_INIT_VECTOR_MODE_IRQ: с "0"/"1" на "определение не объявлено"/"определение объявлено".
        4. DMA:
            - [КРИТИЧЕСКОЕ] функция DMA_GetChannelState() переименована на DMA_GetChannelMode(), скорректированы возвращаемые ей значения.
            - [КРИТИЧЕСКОЕ] изменено количество аргументов функции DMA_SG_ChannelInit() для поддержки режима DMA_MODE_PER_SG_PRIMARY.
            - исправлено поведение функции DMA_CtrlDataInit() для поддержки режима DMA_MODE_PER_SG_PRIMARY и корректной работы режима DMA_MODE_MEM_SG_PRIMARY.
            - исправлена работа функции DMA_Cmd().
            - унифицированы названия аргументов функций с типом DMA_DataStructSelection_TypeDef.
            - внесен сброс полей CYCLE_CTRL и NEXT_USEBURST в функции DMA_ChannelReloadCycle() для корректной реинициализации.
            - оптимизирована работа функций DMA_ChannelReloadCycle(), DMA_GetChannelTransferCounter().
            - заменено чтение регистра MDR_DMA->ALT_CTRL_BASE_PTR на указатель на массив DMA_ControlTable в функциях DMA_CtrlInit(), DMA_ChannelInit() и DMA_SG_ChannelInit().
            - для полей типов DMA_Control_TypeDef и DMA_CtrlData_TypeDef добавлен квалификатор volatile для предотвращения оптимизации чтения при внешнем изменении контроллером DMA.
            - исправлено некорректное выравнивание структуры с управляющими данными каналов DMA при конфигурации определений DMA_ALTERNATE_DATA и DMA_CHANNELS_NUMBER.
            - для массива DMA_ControlTable[] изменено размещение с __RAM_AHB_DATA на __RAM_AHB_BSS.
            - функция DMA_SG_ChannelInit() объявляется только при объявленном DMA_ALTERNATE_DATA (ранее осуществлялась динамическая проверка DMA_ALTERNATE_DATA == 1).
        5. I2C:
            - [КРИТИЧЕСКОЕ] определение IS_I2C_DIRECTION переименовано в IS_I2C_TRANSFER_DIRECTION;
            - [КРИТИЧЕСКОЕ] переименованы элементы энумерации I2C_Status_TypeDef;
            - [КРИТИЧЕСКОЕ] переименованы определения I2C_FLAG_CMD_nWR, I2C_FLAG_CMD_nRD, I2C_FLAG_nSTOP, I2C_FLAG_nSTART, I2C_FLAG_nIRQ, I2C_FLAG_nTRANS, I2C_FLAG_ARB_OK, I2C_FLAG_BUS_FREE, I2C_FLAG_SLAVE_ACK;
            - [КРИТИЧЕСКОЕ] функции I2C_SendByte() и I2C_GetReceivedData() переименованы в I2C_SendData() и I2C_ReceiveData();
            - доработаны комментарии для Doxygen.
        6. FLASH:
            - [КРИТИЧЕСКОЕ] изменен порядок аргументов в функциях FLASH_ProgramByte(), FLASH_ProgramHalfWord(), FLASH_ProgramWord(): аргумент Bank указан последним, аналогично другим функциям FLASH;
            - исправлена функция FLASH_GetPageAddress(): возвращаемый адрес страницы указывается относительно базового адреса области FLASH-памяти;
            - для MDR1206AFI исправлена функция FLASH_ProgramWordArrayBurst(): скорректирована обработка защиты производственной информации и обработка адреса при программировании строки;
            - для функции FLASH_GetPageAddress() убран атрибут __RAM_TEXT, так как функция может быть размещена в любой области памяти;
            - добавлено отключение прерываний в M-режиме на время регистрового доступа к FLASH-памяти (программирование/стирание/чтение) и на время программирования OTP для блокировки JTAG;
            - [КРИТИЧЕСКОЕ] программная задержка изменена на задержку с использованием счетчика ядра CYCLE;
            - скорректированы названия приватных макросов;
            - для публичных функций макрос __RAM_TEXT заменен на __RAM_TEXT_NOINLINE для избежания оптимизации встраивания;
            - скорректированы комментарии для Doxygen.
        7. PORT:
            - в функциях PORT_(De)Init() реализована безопасная последовательность записи регистров;
            - реализован функционал с правильной установкой работы вывода в аналоговом режиме (на выводе Z-состояние);
            - [КРИТИЧЕСКОЕ] определения PORT_DIRECTION_IN и PORT_DIRECTION_OUT из PORT_Direction_TypeDef стали PORT_DIRECTION_INPUT и PORT_DIRECTION_OUTPUT соответственно.
        8. RST_CLK:
            - [КРИТИЧЕСКОЕ] изменены возможные значения энумерации RST_CLK_PLLCPU_ClockSource_TypeDef, как следствие изменено поведение функции RST_CLK_CPU_PLL_Config() - теперь функция не модифицирует CPU_C1;
            - [КРИТИЧЕСКОЕ] для функции RST_CLK_GetClocksFreq() добавлен аргумент для выбора обновляемых полей структуры RST_CLK_Freq_TypeDef;
            - [КРИТИЧЕСКОЕ] для обеспечения точности скорректированы функции: RST_CLK_HSE_GetStatus() и RST_CLK_CPU_PLL_GetStatus().
        9. USART: в функции USART_Init() исправлена настройка делителя и убран сброс бита USART_CR1_UE.
        10. UTILS:
            - оптимизировано выполнение функции GetChipID(): при использовании USE_MDR1206 добавлено кэширование ID, при использовании USE_MDR1206FI или USE_MDR1206AFI функция заменяется макросом на соответствующий ID;
            - для функций DELAY скорректирован расчет задержек для более точного округления, расширен диапазон задержки мкс до 2^26.
        11. Исправлен ряд предупреждений, выявленных статическим анализатором.

Удалено:
    CMSIS-DEVICE:
        1. CORE_CONFIG: убрано неиспользуемое определение FPU_PRESENT.
        2. MDR32VF0xI: [КРИТИЧЕСКОЕ] удалены определения F0FAULTCONx (автоматическое переключение каналов сигма-дельта АЦП) за неактуальностью работы функционала.
        3. SYSTEM:
            - убрана функция __low_level_init, применяемая для IAR (неактуальна в связи с переходом на добавленные startup-файлы);
            - убрано отдельное объявление переменной SystemCoreClock для IAR (неактуальнo в связи с переходом на добавленные startup-файлы).
        4. SYSTEM_CONFIG: убраны неиспользуемые определения HSE_EXT_GEN_MODE и LSE_EXT_GEN_MODE.
    SPL:
        1. ADCUI: [КРИТИЧЕСКОЕ] удалены определения F0FAULTCONx (автоматическое переключение каналов сигма-дельта АЦП) за неактуальностью работы функционала.
        2. BKP: [КРИТИЧЕСКОЕ] убраны функции BKP_MEM_DeInit(), BKP_CONTROL_DeInit(), BKP_SW_DeInit(), BKP_CLK_DeInit() и BKP_RTC_DeInit(), их функционал заменяет функция BKP_DeInit().
        3. DMA: удалено избыточное прямое подключение заголовочного файла core_clic.h.
        4. UTILS: удалено избыточное прямое подключение заголовочного файла core_clint.h.

--------------------------------------------------------------------------------

v.0.1.0 19/04/2024

Первоначальная версия.

